﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace InnvoiceActual.Logica.GestorObject
{

    public sealed class EmpresaCS : INotifyPropertyChanged, IDataErrorInfo
    {
        private static EmpresaCS instance;
        public byte CodigoEmpresa { get; set; }
        string razonSocial;
        int    nro_comprobante1;
        string responsableLegal;
        DateTime inicioActividad;
        string direccion;
        string localidad;
        string provincia;
        string pais;
        string telefono;
        string direccionCorreo;
        string codigoPostal;
        string numeroDeDoc;
        string numeroDeContrib;
        string paginaWeb;
        public event PropertyChangedEventHandler PropertyChanged;


        private EmpresaCS() {
            razonSocial = "Razon Social";
            responsableLegal = "Responsable legal";
            inicioActividad = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
            direccion = "Dirección";
            localidad = "Localidad";
            provincia = "Provincia";
            pais = "País";
            codigoPostal = "Código Postal";
            numeroDeDoc = "Número de Documento";
            numeroDeContrib = "Número de Contribuyente";
            direccionCorreo = "Correo Electrónico";
            paginaWeb = "Pagina Web";
            ExistenDatos = false;
        }

        public static EmpresaCS Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new EmpresaCS();
                }
                return instance;
            }
        }

        #region variables
        
        public string Error
        {
            get
            {
                return null;
            }
        }
        public string this[string propertyName]
        {
            get
            {
                return IsValid(propertyName);
            }
        }
        public int NroComprabante1
        {
            get
            {
                return nro_comprobante1;
            }
            set
            {
                nro_comprobante1 = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NroComprobante1"));
            }
        }
        public string RazonSocial
        {
            get
            {
                return razonSocial;
            }
            set
            {
                razonSocial = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("RazonSocial"));
            }
        }
        public string ResponsableLegal
        {
            get
            {
                return responsableLegal;
            }
            set
            {
                responsableLegal = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ResponsableLegal"));
            }
        }
        public string Direccion
        {
            get
            {
                return direccion;
            }
            set
            {
                direccion = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Direccion"));
            }
        }

        public DateTime InicioActividad
        {
            get
            {
                return inicioActividad;
            }
            set
            {
                inicioActividad = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("InicioActividad"));
            }
        }

        public string Localidad
        {
            get
            {
                return localidad;
            }
            set
            {
                localidad = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Localidad"));
            }
        }
        public string Provincia
        {
            get
            {
                return provincia;
            }
            set
            {
                provincia = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Provincia"));
            }
        }
        public string Pais
        {
            get
            {
                return pais;
            }
            set
            {
                pais = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Pais"));
            }
        }
        public string CodigoPostal
        {
            get
            {
                return codigoPostal;
            }
            set
            {
                codigoPostal = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("CodigoPostal"));
            }
        }
        public byte TipoDoc { get; set; }
        public string NumeroDeDoc
        {
            get
            {
                return numeroDeDoc;
            }
            set
            {
                numeroDeDoc = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NumeroDeDoc"));
            }
        }
        public byte TipoContribuyente { get; set; }
        public string NumeroDeContrib
        {
            get
            {
                return numeroDeContrib;
            }
            set
            {
                numeroDeContrib = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NumeroDeContrib"));
            }
        }
        public string Telefono
        {
            get
            {
                return telefono;
            }
            set
            {
                telefono = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Telefono"));
            }
        }
        public string DireccionCorreo
        {
            get
            {
                return direccionCorreo;
            }
            set
            {
                direccionCorreo = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("DireccionCorreo"));
            }
        }
        public string PaginaWeb
        {
            get
            {
                return paginaWeb;
            }
            set
            {
                paginaWeb = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("PaginaWeb"));
            }
        }
        public bool ExistenDatos { get; set; }

        #endregion variables

        #region metodos

        private string IsValid(string propertyName)
        {
            switch (propertyName)
            {
                case "RazonSocial":
                    if (string.IsNullOrWhiteSpace(RazonSocial))
                        return "El campo Razon Social es requerido";
                    else if (10 > RazonSocial.Length)
                        return "El campo Razon Social debe " +
                            "contener más de 10 caracteres";
                    break;
                case "ResponsableLegal":
                    if (string.IsNullOrWhiteSpace(ResponsableLegal))
                        return "El campo Nombre es requerido";
                    else if (10 > ResponsableLegal.Length)
                        return "El campo Responsable Legal no debe " +
                            "contener más de 10 caracteres";
                    break;
                case "Direccion":
                    if (string.IsNullOrWhiteSpace(Direccion))
                        return "El campo Dirección es requerido";
                    else if (10 > Direccion.Length)
                        return "El campo Dirección debe " +
                            "contener más de 10 caracteres";
                    break;
                case "Localidad":
                    if (string.IsNullOrWhiteSpace(Localidad))
                        return "El campo Localidad es requerido";
                    break;
                case "Provincia":
                    if (string.IsNullOrWhiteSpace(Provincia))
                        return "El campo Provincia es requerido";
                    break;
                case "Pais":
                    if (string.IsNullOrWhiteSpace(Pais))
                        return "El campo País requerido";
                    break;
                case "CodigoPostal":
                    if (string.IsNullOrWhiteSpace(CodigoPostal))
                        return "El campo Codigo Postal es requerido - ej: 3000";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{4}$");
                        if (!regEx.IsMatch(CodigoPostal))
                            return "El campo Codigo Postal no " +
                                   "tiene un formato correcto \n ej:3000";
                    }
                    break;
                case "NumeroDeDoc":
                    if (string.IsNullOrWhiteSpace(NumeroDeDoc))
                        return "El campo Número de Documento es requerido \n ej: 23.489.345 o 23489345";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{1,3}\.[0-9]{3}\.[0-9]{3}|^[0-9]{8,9}$");
                        if (!regEx.IsMatch(NumeroDeDoc))
                            return "El campo Número de Documento no " +
                                   "tiene un formato correcto \n ej: 23.489.345 o 23489345";
                    }
                    break;

                case "NumeroDeContrib":
                    if (string.IsNullOrWhiteSpace(NumeroDeContrib))
                        return "El campo Número de Contribución es requerido \n ej: 27-23480444-0";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{2}\-[0-9]{7,9}\-[0-9]{1}$");
                        if (!regEx.IsMatch(NumeroDeContrib))
                            return "El campo Número de Contribución no \n" +
                                   "tiene un formato correcto \n ej:  27-23480444-0";
                    }
                    break;

                case "Telefono":
                    if (string.IsNullOrWhiteSpace(Telefono))
                        return "El campo Telefono es requerido";
                    break;
                case "DireccionCorreo":
                    if (string.IsNullOrWhiteSpace(DireccionCorreo))
                        return "El campo Correo Electrónico es requerido \n ej: notengo@gmail.com";
                    else if (15 > DireccionCorreo.Length)
                        return "El campo Correo Electrónico debe "
                            + "contener más de 15 caracteres";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\." +
                            @"(\w{2}|(com|net|org|edu|int|mil|gov|arpa|" +
                            @"biz|aero|name|coop|info|pro|museum))$");
                        if (!regEx.IsMatch(DireccionCorreo))
                            return "El campo Correo Electrónico no " +
                                   "tiene un formato correcto \n ej: notengo@gmail.com";
                    }
                    break;
                case "PaginaWeb":
                    if (string.IsNullOrWhiteSpace(PaginaWeb))
                        return "El campo Pagina Web es requerido \n ej: www.notengo.com";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^(www|http:\/\/)(.*\.(com$|com.ar$|net$|org$))");
                        if (!regEx.IsMatch(PaginaWeb))
                            return "El campo Pagina Web no " +
                                   "tiene un formato correcto \n ej: www.notengo.com";
                    }
                    break;
            }
            return null;
        }

        public bool IsValid()
        {
            return string.IsNullOrEmpty(IsValid("RazonSocial"))
                && string.IsNullOrEmpty(IsValid("NroComprobante1"))
                && string.IsNullOrEmpty(IsValid("ResponsableLegal"))
                && string.IsNullOrEmpty(IsValid("InicioActividad"))
                && string.IsNullOrEmpty(IsValid("Direccion"))
                && string.IsNullOrEmpty(IsValid("Localidad"))
                && string.IsNullOrEmpty(IsValid("Provincia"))
                && string.IsNullOrEmpty(IsValid("Pais"))
                && string.IsNullOrEmpty(IsValid("CodigoPostal"))
                && string.IsNullOrEmpty(IsValid("NumeroDeDoc"))
                && string.IsNullOrEmpty(IsValid("NumeroDeContrib"))
                && string.IsNullOrEmpty(IsValid("Telefono"))
                && string.IsNullOrEmpty(IsValid("DireccionCorreo"))
                && string.IsNullOrEmpty(IsValid("PaginaWeb"));
        }

        
        public string VerDatosEmpresa() {
            string cadena = "Razon Social :: " + razonSocial + "  " + " -- Punto de Venta :: " + NroComprabante1 + "\n" +
                            "Responsable Legal :: " + ResponsableLegal + "\n" +
                            "Fecha de Inicio :: " + InicioActividad + "\n" +
                            "Dirección :: " + direccion + "\n" +
                            "Localidad :: " + localidad + "\n" +
                            "Provincia :: " + provincia + "\n" +
                            "País :: " + pais + "\n" +
                            "Código Postal :: " + codigoPostal + "\n" +
                            "Número de Documento :: " + numeroDeDoc + "\n" +
                            "Número de Contribuyente :: " + numeroDeContrib + "\n" +
                            "Direcciñon de Correo :: " + direccionCorreo + "\n" +
                            "Página Web :: " + paginaWeb ;
            
            return cadena;
        }


        #endregion metodos
    }
}
